package edu.del.teamknowledgebase.common.repository;

import cn.hutool.json.JSONUtil;
import edu.del.teamknowledgebase.common.constant.cache.CacheKeyConstant;
import edu.del.teamknowledgebase.common.session.SessionData;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;


/**
 * Redis HttpSession 仓库
 * 手动管理 Session 的存储和读取
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class RedisHttpSessionRepository {

    private final StringRedisTemplate redisTemplate;

    /**
     * Session 过期时间（秒）
     * 7天
     */
    private static final long SESSION_EXPIRE_SECONDS = 7 * 24 * 60 * 60;

    /**
     * 构建 Redis key
     */
    private String buildSessionKey(String sessionId) {
        return String.format(CacheKeyConstant.SESSION_KEY_PREFIX, sessionId);
    }

    /**
     * 保存 Session 数据到 Redis
     */
    public void saveSession(String sessionId, SessionData sessionData) {
        String key = buildSessionKey(sessionId);
        String json = JSONUtil.toJsonStr(sessionData);

        redisTemplate.opsForValue().set(
            // 需要写入的 key
            key,
            // 需要写入的 value
            json,
            // 过期时间
            SESSION_EXPIRE_SECONDS,
            // 时间单位
            TimeUnit.SECONDS
        );
        log.info("Session 已保存到 Redis：sessionId={}, userId={}", sessionId,sessionData.getUserId());
    }

    /**
     * 获取 Session 数据
     */
    public SessionData getSession(String sessionId) {
        String key = buildSessionKey(sessionId);
        String json = redisTemplate.opsForValue().get(key);

        if (json == null) {
            return null;
        }

        SessionData sessionData = JSONUtil.toBean(json, SessionData.class);

        // 更新最后的活跃时间并续期
        sessionData.setLastActiveTime(java.time.LocalDateTime.now());
        saveSession(sessionId, sessionData);

        return sessionData;
    }

    /**
     * 删除 Session 数据
     */
    public void deleteSession(String sessionId) {
        redisTemplate.delete(buildSessionKey(sessionId));
        log.info("Session 已从 Redis 中删除：sessionId={}", sessionId);
    }

    /**
     * 检查 Session 是否存在
     */
    public boolean existsSession(String sessionId) {
        String key = buildSessionKey(sessionId);
        return Boolean.TRUE.equals(redisTemplate.hasKey(key));
    }
}
